产品简介
这是一款16bit高分辨率DAC模块,满量程误差仅±0.2%,支持I2C或PWM信号驱动,可灵活配置为±10V、0-5V、0-10V电压信号,或4-20mA电流信号输出,适配多场景控制需求。
相较于常规0-10V信号,±10V模拟电压是本模块的核心特点——输出范围覆盖-10V至+10V,新增反向电压输出能力,可直接实现设备的反向控制。这类对称电压信号是诸多设备的刚需,比如小型电机控制:+10V驱动电机正向转,-10V驱动反向转,0V则停机,无需额外电路改造。
模块兼容Arduino编程环境,广泛适配ESP32、树莓派等主控,可直接驱动灯光、水泵、伺服电机等需上述信号控制的设备,简单易用。
本产品属于DAC系列模块,该系列模块都能通过 I2C 或 PWM 信号控制,输出电压或电流,且提供丰富选型:分辨率涵盖8bit、12bit、15bit、16bit,通道可选1通道/ 2通道,还支持多模块级联,可灵活组合为多通道输出方案。
产品特性
- 支持3.3V-5V电源供电,标准Gravity接口。
- 支持I2C/PWM信号输入,适配广泛。
- 16bit分辨率、满量程误差小于0.2% 。
- 支持输出±10V对称模拟电压信号。
- 支持输出0-5V、0-10V模拟电压信号。
- 支持输出4-20mA模拟电流信号。
- 支持1.2倍超量程电压电流信号输出。
- 支持Arduino编程,适配ESP32、Arduino等主控。
- 8路I2C地址可调,最多可同时控制8路设备。
应用场景
- 电机正反向控制
- 灯光亮度控制
- 阀门水泵控制
- 信号发生器
- 小型设备的自动化改造
产品参数
基本参数
- 芯片型号:GP8630N
- 工作电压:3.3V-5V
- 供电/通讯接口:PH2.0-4P/3P
- 输入信号:I2C/PWM
- 输出信号:
- 电流输出范围:0-24mA
- 电压输出范围:±12V/0-6V/0-12V
- 通道数:1通道
- 分辨率:16bit(I2C)/8bit、10bit(PWM:可根据主控选择)
- 满量程误差:±0.2%(拟合校准后实测误差)
- 数值范围:
- I2C模式:0-65535对应±12V或0-6V或0-12V或0-24mA
- PWM模式:
- 0-255对应±12V或0-6V或0-12V或0-24mA
- 0-1023对应±12V或0-6V或0-12V或0-24mA
物理尺寸
- PCB尺寸:42×32×12.39 mm
- 安装孔间距:25 mm
- 安装孔直径:3.0 mm
功能示意图

硬件接口说明
模块接口分为I2C 接口、PWM 接口与输出接口三类,各引脚功能定义如下表所示:
| 接口类型 | 引脚丝印 | 功能描述 |
|---|---|---|
| I2C接口 | + | 电源正极(3.3V-5V) |
| - | 电源负极 | |
| SCL | I2C时钟线SCL | |
| SDA | I2C数据线SDA | |
| PWM接口 | - | 电源负极 |
| + | 电源正极(3.3V-5V) | |
| D | PWM信号输入引脚 | |
| 输出接口 | OUT | 输出信号正极(电压/电流)范围:0-10V 0-12V 10-0V -12-0V 0-24mA 4-20mA |
| GND | 输出信号负极 |
拨码开关配置逻辑
拨码开关(A0、A1、A2)用于切换I2C 地址与PWM 输出范围,需根据控制方式选择对应配置,不可混用。
I2C 模式:配置模块 I2C 地址
通过 A0、A1、A2 的 “0(断开)/1(闭合)” 组合,定义模块的 I2C 通信地址,默认地址为0x58(A0/A1/A2 均为 0)。
| I2C模式 | |||
|---|---|---|---|
| A2 | A1 | A0 | ADDR |
| 0 | 0 | 0 | 0x58 |
| 0 | 0 | 1 | 0x59 |
| 0 | 1 | 0 | 0x5A |
| 0 | 1 | 1 | 0x5B |
| 1 | 0 | 0 | 0x5C |
| 1 | 0 | 1 | 0x5D |
| 1 | 1 | 0 | 0x5E |
| 1 | 1 | 1 | 0x5F |
PWM模式:配置输出信号范围
仅需关注 A0、A1、A2 的特定组合,即可定义 PWM 控制下的输出类型(电压 / 电流)及范围。
| A2 | A1 | A0 | OUT |
|---|---|---|---|
| 0 | 1 | 0 | -12-0V |
| 0 | 1 | 1 | 0-12V |
| 1 | 0 | 0 | 0-24mA |
Arduino IDE 使用教程
- 硬件准备
- DFR1230 GP8630N: I2C&PWM转0-5V&0-10V&±10V&4-20mA ×1
- DFR0654 FireBeetle 2 ESP32-E ×1
- 软件准备
例程1:I2C 模式下 0-10V 量程输出 10V
目标
通过 ESP32-E 主控上的 I2C 通信控制模块 0-10V 量程输出 10V 电压,并用万用表验证结果。
步骤 1:接线配置

- 按图示连接模块与 ESP32-E,核心对应关系:
-
模块 I2C 接口 “+” → ESP32-E 3.3V
-
模块 I2C 接口 “-” → ESP32-E GND
-
模块 I2C 接口 “SCL” → ESP32-E SCL(默认 GPIO22)
-
模块 I2C 接口 “SDA” → ESP32-E SDA(默认 GPIO21)
-
拨码开关配置:A0=0、A1=0、A2=0(I2C 地址 = 0x58)
-
步骤 2:代码上传
-
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
-
#include <DFRobot_GP8XXX.h>
// 启用I2C通信模式
#define I2C_COMMUNICATION
// 模块I2C地址设置为0x58
#define MODULE_I2C_ADDRESS 0x58
// 创建I2C通信对象
DFRobot_GP8630N_I2C GP8630N(&Wire, MODULE_I2C_ADDRESS);
void setup() {
// 初始化串口通信
Serial.begin(9600);
// 初始化DAC模块
while (GP8630N.begin() != 0) {
Serial.println("Communication with the device failed. Please check if the connection is normal or if the device address is set correctly.");
delay(1000);
}
Serial.println("Successful connection!");
// 设置输出范围为0-10V
GP8630N.setDACOutRange(GP8630N.eOutputRange10V);
// 输出10V(65535对应10V满量程)
GP8630N.setDACOutData(65535);
}
void loop() {
// 无需循环操作,设置一次即可保持输出
}
结果验证:
- 万用表调至 “DC V” 档;
- 红表笔接模块“OUT”端,黑表笔接模块“GND”端;
- 正常情况测得电压接近 10V,此示例中测得实际输出电压为 10.04V。

例程2:PWM 模式下 4-20mA 量程输出 20mA
目标
通过 ESP32-E 主控上的 PWM 通信控制模块 4-20mA 量程输出 20mA,并用万用表验证结果。
步骤 1:接线配置

按图示连接模块与 ESP32-E,核心对应关系:
- 模块 PWM 接口 “+” → ESP32-E 3.3V
- 模块 PWM 接口 “-” → ESP32-E GND
- 模块 PWM 接口 “D” → ESP32-E GPIO13(PWM 输出引脚)
- 拨码开关配置:A0=0、A1=0、A2=1(输出范围 = 4-20mA)
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include <DFRobot_GP8XXX.h>
// 定义PWM引脚为13(适用于ESP32)
const int pwmPin = 13;
DFRobot_GP8630N_PWM GP8630N(pwmPin);
void setup() {
// 初始化传感器
GP8630N.begin();
// 设置输出数据(ESP32在PWM模式下范围为0-1023)
uint16_t data = 1023; // 最大输出值
GP8630N.setDACOutData(max(data*0.83, 170.5));
}
void loop() {
}
结果验证:
- 万用表调至 “DC A” 档;
- 红表笔接模块“IOUT”端,黑表笔接模块“GND”端
- 正常情况测得电流接近 20mA,此示例中测得实际输出电流为 20.24mA

API函数
/**************************************************************************
I2C & PWM 系列
**************************************************************************/
/**
* @fn begin
* @brief 初始化函数
* @return 返回0表示成功,其他值表示失败
*/
int begin(void);
/**
* @fn setDACOutRange
* @brief 设置DAC输出范围(仅I2C模式下有效)
* @param range DAC输出范围
* @n eOutputRange5V(0-5V)
* @n eOutputRange6V(0-6V) GP8630N、GP8600
* @n eOutputRange10V(0-10V)
* @n eOutputRange_10V(-10-0V) GP8630N
* @n eOutputRange_12V(-12-0V) GP8630N
* @n eOutputRange12V(0-12V) GP8630N、GP8600
* @n eOutputRange20MA(0-20mA)
* @n eOutputRange24MA(0-24mA) GP8630N、GP210
* @return NONE
*/
void setDACOutRange(eOutPutRange_t range);
/**
* @fn setDACOutData
* @brief 设置单通道模块输出DAC值
* @param data DAC值
* @note PWM模式下根据PWM脉宽输出电流/电压值,根据模块背面的丝印,拨码选择电流/电压输出范围
* @note I2C模式下根据setDACOutRange()设置的输出范围输出电流/电压值
* @return NONE
*/
void setDACOutData(uint16_t data);
DAC精度及校准方法说明
DAC 精度及校准概述
DAC(数模转换器)的精度是指其实际输出值与理想输出值之间的接近程度。精度越高,偏差越小。
校准的目的:
DAC模块因内部元器件差异或使用环境影响,其输出可能存在“偏移”和“增益”误差。拟合校准的核心是通过数学拟合算法修正原始输出偏差,建立 “程序控制参数” 与 “实际输出值” 的精准映射关系,从而大幅提升精度。
DAC 校准实操教程(PWM 模式・0-12V 量程)
本教程以 PWM 模式 “0-12V 量程(程序参数范围 0-1023)” 为例,采用线性拟合算法,通过 Excel 快速计算校准参数,步骤简洁易懂,无需复杂编程。
校准前提
硬件准备:
- DAC 模块(PWM 模式)
- ESP32-E 主控
- 万用表
软件准备:
- Excel 表格(用于计算校准参数)
- DAC 控制程序
环境要求:
- 环境温度稳定(避免温漂影响测量)
- 电源电压无明显波动
数据采集与准备
采集要求
- 选取 5 组及以上中间值程序参数(不可选量程端点 0 或 1023):端点数据易受硬件极限特性影响,可能导致拟合曲线偏离实际工作区间,中间值可保证拟合精度;
- 程序参数均匀分布:覆盖 0-1023 全范围,确保拟合曲线覆盖整个量程。
步骤 1:原始数据记录
按选定的程序参数配置 DAC,用万用表测量实际输出电压,记录如下表格(示例数据):
| 程序参数(x) | 理论输出电压(V) | 实际输出电压(V) | 绝对误差(V) | 相对误差 |
|---|---|---|---|---|
| 0 | 0 | 0.0052 | 0.0052 | 0.0433% |
| 85 | 1 | 1.002 | 0.0020 | 0.0167% |
| 171 | 2 | 1.9961 | -0.0039 | -0.0325% |
| 256 | 3 | 2.9926 | -0.0074 | -0.0617% |
| 341 | 4 | 4.0012 | 0.0012 | 0.0100% |
| 426 | 5 | 4.9951 | -0.0049 | -0.0408% |
| 512 | 6 | 5.9924 | -0.0076 | -0.0633% |
| 597 | 7 | 6.9846 | -0.0154 | -0.1283% |
| 682 | 8 | 7.9912 | -0.0088 | -0.0733% |
| 767 | 9 | 8.9891 | -0.0109 | -0.0908% |
| 853 | 10 | 9.9868 | -0.0132 | -0.1100% |
| 938 | 11 | 10.9826 | -0.0174 | -0.1450% |
| 1023 | 12 | 12.0060 | 0.0060 | 0.0500% |
注:表格中 0 和 1023 仅用于展示满量程误差,拟合计算时需排除端点数据(0、1023),仅用中间 11 组。
校准参数计算(Excel 工具)
通过 Excel 表格的线性拟合函数,计算校准所需的变换系数 c和变换偏移 o,核心逻辑是修正原始 “程序参数 - 实际输出” 的线性偏差。
步骤 2:输入数据到 Excel
在 Excel 中按如下格式输入中间 11 组数据(示例单元格范围):
| 单元格 | 内容(程序参数 x) | 单元格 | 内容(实际输出电压 y) |
|---|---|---|---|
| B11 | 85 | D11 | 1.002 |
| B12 | 171 | D12 | 1.9961 |
| B13 | 256 | D13 | 2.9926 |
| B14 | 341 | D14 | 4.0012 |
| B15 | 426 | D15 | 4.9951 |
| B16 | 512 | D16 | 5.9924 |
| B17 | 597 | D17 | 6.9846 |
| B18 | 682 | D18 | 7.9912 |
| B19 | 767 | D19 | 8.9891 |
| B20 | 853 | D20 | 9.9868 |
| B21 | 938 | D21 | 10.9826 |
步骤 3:计算原始斜率 k
斜率 k 表示原始状态下 “程序参数变化” 与 “实际输出变化” 的线性关系,excel表格公式如下:
=SLOPE(D11:D21, B11:B21)
- 含义:D11:D21 为实际输出电压范围,B11:B21 为对应程序参数范围,计算两者的线性斜率。
步骤 4:计算原始截距 b
截距 b 表示程序参数为 0 时的实际输出偏移,excel表格公式如下:
=INTERCEPT(D11:D21, B11:B21)
- 含义:基于线性方程 y = k*x + b,计算截距 b。
步骤 5:计算变换系数 c
系数 c 用于修正原始斜率偏差,使输出符合理论量程,excel表格公式如下:
=(理论最大电压 / 最大程序参数) / k
- 示例代入:理论最大电压 = 12V,最大程序参数 = 1023,因此excel表格公式为:
=(12/1023)/k
- 含义:将原始斜率 k 修正为符合理论量程的理想斜率。
步骤 6:计算变换偏移 o
偏移 o 用于抵消原始截距偏差,excel表格公式:
=-b/k
- 含义:通过偏移补偿,消除程序参数为 0 时的固有输出偏差。
步骤 7:代码集成与生效
将 Excel 计算得到的c(变换系数) 和o(变换偏移) 代入 DAC 控制程序,通过校准公式实时修正程序参数,确保实际输出接近理论值。
校准公式:
y = c * x0 + o
- 说明:y = 校准后程序参数(最终写入 DAC 的控制值);x0 = 原始目标程序参数(未校准,由理论输出电压计算得出)。
- 带入上述计算的变换系数及变换偏移值得到的完整校准公式为:y=1.0018 * x0 - 0.0924
代码示例
将获得的c(变换系数) 和o(变换偏移)值填入下方代码

然后就能根据拟合校准算法得到更准确的数据了,完整代码如下:
#include <DFRobot_GP8XXX.h>
// 固定ESP32平台PWM引脚为13,无需多平台适配
const int pwmPin = 13;
DFRobot_GP8600_PWM GP8600(pwmPin);
/**
* @brief 校准函数(ESP32专用,匹配0-6V量程)
* @param data 原始未校准程序参数(0-1023)
* @param coefficient 拟合校准系数c(Excel计算得出)
* @param offset 拟合校准偏移量o(Excel计算得出)
* @return 校准后PWM控制参数(0-1023)
*/
uint16_t calibrationFun(uint16_t data ,double coefficient ,double offset)
{
double tempdata = data * coefficient + offset;
// ESP32平台PWM参数范围固定为0-1023(对应0-6V),直接限幅
if(tempdata > 1023) tempdata = 1023;
if(tempdata < 0) tempdata = 0;
Serial.print("校准后PWM参数:");
Serial.println((uint16_t)tempdata);
return (uint16_t)tempdata;
}
void setup() {
// 初始化串口(用于调试查看校准参数)
Serial.begin(115200);
// 初始化GP8600模块(PWM模式)
GP8600.begin();
/**
* @brief 0-6V量程输出配置(ESP32专用)
* @note 1. 模块拨码开关需配置为0-6V输出(参考模块背面说明)
* @note 2. ESP32平台PWM参数范围0-1023,对应输出0-6V
* @note 3. 如需启用校准,将下方data传入calibrationFun即可
*/
uint16_t data = 1023; // 原始目标程序参数(未校准,由理论输出电压计算得出)
//启用校准(替换为实际计算的coefficient和offset)
GP8600.setDACOutData(calibrationFun(data, caliCoeff, caliOffset));
}
void loop() {
}